home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / TNSERV.C < prev    next >
C/C++ Source or Header  |  1989-08-18  |  3KB  |  121 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "socket.h"
  5. #include "telnet.h"
  6. #include "session.h"
  7. #include "proc.h"
  8. #include "tty.h"
  9. #include "commands.h"
  10.  
  11. static int Stelnet = -1;    /* Protoype socket for service */
  12.  
  13. static void tnhandle __ARGS((int s,void *unused,void *p));
  14.  
  15. int
  16. tnstart(argc,argv,p)
  17. int argc;
  18. char *argv[];
  19. void *p;
  20. {
  21.     struct sockaddr_in lsocket;
  22.     int s;
  23.  
  24.     if(Stelnet != -1){
  25.         freeargs(argc,argv);
  26.         return 0;
  27.     }
  28.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  29.     chname(Curproc,"Telnet listener");
  30.  
  31.     lsocket.sin_family = AF_INET;
  32.     lsocket.sin_addr.s_addr = Ip_addr;
  33.     if(argc < 2)
  34.         lsocket.sin_port = IPPORT_TELNET;
  35.     else
  36.         lsocket.sin_port = atoi(argv[1]);
  37.  
  38.     freeargs(argc,argv);
  39.     Stelnet = socket(AF_INET,SOCK_STREAM,0);
  40.     bind(Stelnet,(char *)&lsocket,sizeof(lsocket));
  41.     listen(Stelnet,1);
  42.     for(;;){
  43.         if((s = accept(Stelnet,NULLCHAR,(int *)NULL)) == -1)
  44.             break;    /* Service is shutting down */
  45.         
  46.         newproc("in_telnet",2048,tnhandle,s,NULL,NULL);
  47.     }
  48.     return 0;
  49. }
  50. /* Handle incoming Telnet session */
  51. static void
  52. tnhandle(s,unused,p)
  53. int s;
  54. void *unused;
  55. void *p;
  56. {
  57.     struct session *sp;
  58.     char *cp;
  59.     struct sockaddr_in fsocket;
  60.     struct mbuf *bp;
  61.     int i;
  62.     struct telnet tn;
  63.  
  64.     sockowner(s,Curproc);    /* We own it now */
  65.     log(s,"open Telnet");
  66.  
  67.     /* Allocate a session descriptor */
  68.     if((sp = newsession(NULLCHAR,TELNET)) == NULLSESSION){
  69.         usprintf(s,"Too many sessions\n");
  70.         close_s(s);
  71.         return;
  72.     }
  73.     sp->ttymode = TTY_EDIT|TTY_ECHO;
  74.  
  75.     /* Initialize a Telnet protocol descriptor */
  76.     memset((char *)&tn,0,sizeof(tn));
  77.     tn.session = sp;    /* Upward pointer */
  78.     sp->cb.telnet = &tn;    /* Downward pointer */
  79.     sp->s = s;
  80.     tn.output = Curproc;
  81.  
  82.     i = SOCKSIZE;
  83.     getpeername(s,(char *)&fsocket,&i);
  84.     cp = psocket((struct sockaddr *)&fsocket);
  85.     printf("\007Incoming telnet session %u from %s\007\n",
  86.     (unsigned)(sp - Sessions),cp);
  87.     /* Fork off the receiver process */
  88.     tn.input = newproc("tel_in",512,tel_input,0,&tn,NULL);
  89.  
  90.     /* Now send whatever's typed on the terminal */
  91.     for(;;){
  92.         while(sp->input == NULLBUF)
  93.             if(pwait(&sp->input) == -1)
  94.                 goto quit;
  95.  
  96.         bp = dequeue(&sp->input);
  97.  
  98.         /* If we're doing our own echoing and recording is enabled,
  99.          * record it
  100.          */
  101.         if(tn.remote[TN_ECHO] && sp->record != NULLFILE)
  102.             write_p(sp->record,bp);
  103.         if(send_mbuf(s,bp,0,NULLCHAR,0) == -1)
  104.             break;
  105.     }
  106. quit:    close_s(s);
  107.     killproc(tn.input);
  108.     freesession(sp);
  109. }
  110. /* Shut down Telnet server */
  111. int
  112. tn0(argc,argv,p)
  113. int argc;
  114. char *argv[];
  115. void *p;
  116. {
  117.     close_s(Stelnet);
  118.     Stelnet = -1;
  119.     return 0;
  120. }
  121.